//===----------------------------------------------------------------------===//
//
// This source file is part of the Soto for AWS open source project
//
// Copyright (c) 2017-2024 the Soto project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of Soto project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

// THIS FILE IS AUTOMATICALLY GENERATED by https://github.com/soto-project/soto-codegenerator.
// DO NOT EDIT.

#if canImport(FoundationEssentials)
import FoundationEssentials
#else
import Foundation
#endif
@_exported import SotoCore

/// Service object for interacting with AWS AppFabric service.
///
/// Amazon Web Services AppFabric quickly connects software as a service (SaaS) applications across your organization. This allows IT and security teams to easily manage and secure applications using a standard schema, and employees can complete everyday tasks faster using generative artificial intelligence (AI). You can use these APIs to complete AppFabric tasks, such as setting up audit log ingestions or viewing user access. For more information about AppFabric, including the required permissions to use the service, see the Amazon Web Services AppFabric Administration Guide. For more information about using the Command Line Interface (CLI) to manage your AppFabric resources, see the AppFabric section of the CLI Reference.
public struct AppFabric: AWSService {
    // MARK: Member variables

    /// Client used for communication with AWS
    public let client: AWSClient
    /// Service configuration
    public let config: AWSServiceConfig

    // MARK: Initialization

    /// Initialize the AppFabric client
    /// - parameters:
    ///     - client: AWSClient used to process requests
    ///     - region: Region of server you want to communicate with. This will override the partition parameter.
    ///     - partition: AWS partition where service resides, standard (.aws), china (.awscn), government (.awsusgov).
    ///     - endpoint: Custom endpoint URL to use instead of standard AWS servers
    ///     - middleware: Middleware chain used to edit requests before they are sent and responses before they are decoded 
    ///     - timeout: Timeout value for HTTP requests
    ///     - byteBufferAllocator: Allocator for ByteBuffers
    ///     - options: Service options
    public init(
        client: AWSClient,
        region: SotoCore.Region? = nil,
        partition: AWSPartition = .aws,
        endpoint: String? = nil,
        middleware: AWSMiddlewareProtocol? = nil,
        timeout: TimeAmount? = nil,
        byteBufferAllocator: ByteBufferAllocator = ByteBufferAllocator(),
        options: AWSServiceConfig.Options = []
    ) {
        self.client = client
        self.config = AWSServiceConfig(
            region: region,
            partition: region?.partition ?? partition,
            serviceName: "AppFabric",
            serviceIdentifier: "appfabric",
            serviceProtocol: .restjson,
            apiVersion: "2023-05-19",
            endpoint: endpoint,
            errorType: AppFabricErrorType.self,
            middleware: middleware,
            timeout: timeout,
            byteBufferAllocator: byteBufferAllocator,
            options: options
        )
    }





    // MARK: API Calls

    /// Gets user access details in a batch request. This action polls data from the tasks that are kicked off by the StartUserAccessTasks action.
    @Sendable
    @inlinable
    public func batchGetUserAccessTasks(_ input: BatchGetUserAccessTasksRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> BatchGetUserAccessTasksResponse {
        try await self.client.execute(
            operation: "BatchGetUserAccessTasks", 
            path: "/useraccess/batchget", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Gets user access details in a batch request. This action polls data from the tasks that are kicked off by the StartUserAccessTasks action.
    ///
    /// Parameters:
    ///   - appBundleIdentifier: The Amazon Resource Name (ARN) or Universal Unique Identifier (UUID) of the app bundle to use for the request.
    ///   - taskIdList: The tasks IDs to use for the request.
    ///   - logger: Logger use during operation
    @inlinable
    public func batchGetUserAccessTasks(
        appBundleIdentifier: String,
        taskIdList: [String],
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> BatchGetUserAccessTasksResponse {
        let input = BatchGetUserAccessTasksRequest(
            appBundleIdentifier: appBundleIdentifier, 
            taskIdList: taskIdList
        )
        return try await self.batchGetUserAccessTasks(input, logger: logger)
    }

    /// Establishes a connection between Amazon Web Services AppFabric and an application, which allows AppFabric to call the APIs of the application.
    @Sendable
    @inlinable
    public func connectAppAuthorization(_ input: ConnectAppAuthorizationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ConnectAppAuthorizationResponse {
        try await self.client.execute(
            operation: "ConnectAppAuthorization", 
            path: "/appbundles/{appBundleIdentifier}/appauthorizations/{appAuthorizationIdentifier}/connect", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Establishes a connection between Amazon Web Services AppFabric and an application, which allows AppFabric to call the APIs of the application.
    ///
    /// Parameters:
    ///   - appAuthorizationIdentifier: The Amazon Resource Name (ARN) or Universal Unique Identifier (UUID) of the app authorization to use for the request.
    ///   - appBundleIdentifier: The Amazon Resource Name (ARN) or Universal Unique Identifier (UUID) of the app bundle that contains the app authorization to use for the request.
    ///   - authRequest: Contains OAuth2 authorization information. This is required if the app authorization for the request is configured with an OAuth2 (oauth2) authorization type.
    ///   - logger: Logger use during operation
    @inlinable
    public func connectAppAuthorization(
        appAuthorizationIdentifier: String,
        appBundleIdentifier: String,
        authRequest: AuthRequest? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ConnectAppAuthorizationResponse {
        let input = ConnectAppAuthorizationRequest(
            appAuthorizationIdentifier: appAuthorizationIdentifier, 
            appBundleIdentifier: appBundleIdentifier, 
            authRequest: authRequest
        )
        return try await self.connectAppAuthorization(input, logger: logger)
    }

    /// Creates an app authorization within an app bundle, which allows AppFabric to connect to an application.
    @Sendable
    @inlinable
    public func createAppAuthorization(_ input: CreateAppAuthorizationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateAppAuthorizationResponse {
        try await self.client.execute(
            operation: "CreateAppAuthorization", 
            path: "/appbundles/{appBundleIdentifier}/appauthorizations", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates an app authorization within an app bundle, which allows AppFabric to connect to an application.
    ///
    /// Parameters:
    ///   - app: The name of the application. Valid values are:    SLACK     ASANA     JIRA     M365     M365AUDITLOGS     ZOOM     ZENDESK     OKTA     GOOGLE     DROPBOX     SMARTSHEET     CISCO
    ///   - appBundleIdentifier: The Amazon Resource Name (ARN) or Universal Unique Identifier (UUID) of the app bundle to use for the request.
    ///   - authType: The authorization type for the app authorization.
    ///   - clientToken: Specifies a unique, case-sensitive identifier that you provide to ensure the idempotency of the request. This lets you safely retry the request without accidentally performing the same operation a second time. Passing the same value to a later call to an operation requires that you also pass the same value for all other parameters. We recommend that you use a UUID type of value. If you don't provide this value, then Amazon Web Services generates a random one for you. If you retry the operation with the same ClientToken, but with different parameters, the retry fails with an IdempotentParameterMismatch error.
    ///   - credential: Contains credentials for the application, such as an API key or OAuth2 client ID and secret. Specify credentials that match the authorization type for your request. For example, if the authorization type for your request is OAuth2 (oauth2), then you should provide only the OAuth2 credentials.
    ///   - tags: A map of the key-value pairs of the tag or tags to assign to the resource.
    ///   - tenant: Contains information about an application tenant, such as the application display name and identifier.
    ///   - logger: Logger use during operation
    @inlinable
    public func createAppAuthorization(
        app: String,
        appBundleIdentifier: String,
        authType: AuthType,
        clientToken: String? = CreateAppAuthorizationRequest.idempotencyToken(),
        credential: Credential,
        tags: [Tag]? = nil,
        tenant: Tenant,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateAppAuthorizationResponse {
        let input = CreateAppAuthorizationRequest(
            app: app, 
            appBundleIdentifier: appBundleIdentifier, 
            authType: authType, 
            clientToken: clientToken, 
            credential: credential, 
            tags: tags, 
            tenant: tenant
        )
        return try await self.createAppAuthorization(input, logger: logger)
    }

    /// Creates an app bundle to collect data from an application using AppFabric.
    @Sendable
    @inlinable
    public func createAppBundle(_ input: CreateAppBundleRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateAppBundleResponse {
        try await self.client.execute(
            operation: "CreateAppBundle", 
            path: "/appbundles", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates an app bundle to collect data from an application using AppFabric.
    ///
    /// Parameters:
    ///   - clientToken: Specifies a unique, case-sensitive identifier that you provide to ensure the idempotency of the request. This lets you safely retry the request without accidentally performing the same operation a second time. Passing the same value to a later call to an operation requires that you also pass the same value for all other parameters. We recommend that you use a UUID type of value. If you don't provide this value, then Amazon Web Services generates a random one for you. If you retry the operation with the same ClientToken, but with different parameters, the retry fails with an IdempotentParameterMismatch error.
    ///   - customerManagedKeyIdentifier: The Amazon Resource Name (ARN) of the Key Management Service (KMS) key to use to encrypt the application data. If this is not specified, an Amazon Web Services owned key is used for encryption.
    ///   - tags: A map of the key-value pairs of the tag or tags to assign to the resource.
    ///   - logger: Logger use during operation
    @inlinable
    public func createAppBundle(
        clientToken: String? = CreateAppBundleRequest.idempotencyToken(),
        customerManagedKeyIdentifier: String? = nil,
        tags: [Tag]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateAppBundleResponse {
        let input = CreateAppBundleRequest(
            clientToken: clientToken, 
            customerManagedKeyIdentifier: customerManagedKeyIdentifier, 
            tags: tags
        )
        return try await self.createAppBundle(input, logger: logger)
    }

    /// Creates a data ingestion for an application.
    @Sendable
    @inlinable
    public func createIngestion(_ input: CreateIngestionRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateIngestionResponse {
        try await self.client.execute(
            operation: "CreateIngestion", 
            path: "/appbundles/{appBundleIdentifier}/ingestions", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a data ingestion for an application.
    ///
    /// Parameters:
    ///   - app: The name of the application. Valid values are:    SLACK     ASANA     JIRA     M365     M365AUDITLOGS     ZOOM     ZENDESK     OKTA     GOOGLE     DROPBOX     SMARTSHEET     CISCO
    ///   - appBundleIdentifier: The Amazon Resource Name (ARN) or Universal Unique Identifier (UUID) of the app bundle to use for the request.
    ///   - clientToken: Specifies a unique, case-sensitive identifier that you provide to ensure the idempotency of the request. This lets you safely retry the request without accidentally performing the same operation a second time. Passing the same value to a later call to an operation requires that you also pass the same value for all other parameters. We recommend that you use a UUID type of value. If you don't provide this value, then Amazon Web Services generates a random one for you. If you retry the operation with the same ClientToken, but with different parameters, the retry fails with an IdempotentParameterMismatch error.
    ///   - ingestionType: The ingestion type.
    ///   - tags: A map of the key-value pairs of the tag or tags to assign to the resource.
    ///   - tenantId: The ID of the application tenant.
    ///   - logger: Logger use during operation
    @inlinable
    public func createIngestion(
        app: String,
        appBundleIdentifier: String,
        clientToken: String? = CreateIngestionRequest.idempotencyToken(),
        ingestionType: IngestionType,
        tags: [Tag]? = nil,
        tenantId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateIngestionResponse {
        let input = CreateIngestionRequest(
            app: app, 
            appBundleIdentifier: appBundleIdentifier, 
            clientToken: clientToken, 
            ingestionType: ingestionType, 
            tags: tags, 
            tenantId: tenantId
        )
        return try await self.createIngestion(input, logger: logger)
    }

    /// Creates an ingestion destination, which specifies how an application's ingested data is processed by Amazon Web Services AppFabric and where it's delivered.
    @Sendable
    @inlinable
    public func createIngestionDestination(_ input: CreateIngestionDestinationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateIngestionDestinationResponse {
        try await self.client.execute(
            operation: "CreateIngestionDestination", 
            path: "/appbundles/{appBundleIdentifier}/ingestions/{ingestionIdentifier}/ingestiondestinations", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates an ingestion destination, which specifies how an application's ingested data is processed by Amazon Web Services AppFabric and where it's delivered.
    ///
    /// Parameters:
    ///   - appBundleIdentifier: The Amazon Resource Name (ARN) or Universal Unique Identifier (UUID) of the app bundle to use for the request.
    ///   - clientToken: Specifies a unique, case-sensitive identifier that you provide to ensure the idempotency of the request. This lets you safely retry the request without accidentally performing the same operation a second time. Passing the same value to a later call to an operation requires that you also pass the same value for all other parameters. We recommend that you use a UUID type of value. If you don't provide this value, then Amazon Web Services generates a random one for you. If you retry the operation with the same ClientToken, but with different parameters, the retry fails with an IdempotentParameterMismatch error.
    ///   - destinationConfiguration: Contains information about the destination of ingested data.
    ///   - ingestionIdentifier: The Amazon Resource Name (ARN) or Universal Unique Identifier (UUID) of the ingestion to use for the request.
    ///   - processingConfiguration: Contains information about how ingested data is processed.
    ///   - tags: A map of the key-value pairs of the tag or tags to assign to the resource.
    ///   - logger: Logger use during operation
    @inlinable
    public func createIngestionDestination(
        appBundleIdentifier: String,
        clientToken: String? = CreateIngestionDestinationRequest.idempotencyToken(),
        destinationConfiguration: DestinationConfiguration,
        ingestionIdentifier: String,
        processingConfiguration: ProcessingConfiguration,
        tags: [Tag]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateIngestionDestinationResponse {
        let input = CreateIngestionDestinationRequest(
            appBundleIdentifier: appBundleIdentifier, 
            clientToken: clientToken, 
            destinationConfiguration: destinationConfiguration, 
            ingestionIdentifier: ingestionIdentifier, 
            processingConfiguration: processingConfiguration, 
            tags: tags
        )
        return try await self.createIngestionDestination(input, logger: logger)
    }

    /// Deletes an app authorization. You must delete the associated ingestion before you can delete an app authorization.
    @Sendable
    @inlinable
    public func deleteAppAuthorization(_ input: DeleteAppAuthorizationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteAppAuthorizationResponse {
        try await self.client.execute(
            operation: "DeleteAppAuthorization", 
            path: "/appbundles/{appBundleIdentifier}/appauthorizations/{appAuthorizationIdentifier}", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes an app authorization. You must delete the associated ingestion before you can delete an app authorization.
    ///
    /// Parameters:
    ///   - appAuthorizationIdentifier: The Amazon Resource Name (ARN) or Universal Unique Identifier (UUID) of the app authorization to use for the request.
    ///   - appBundleIdentifier: The Amazon Resource Name (ARN) or Universal Unique Identifier (UUID) of the app bundle to use for the request.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteAppAuthorization(
        appAuthorizationIdentifier: String,
        appBundleIdentifier: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteAppAuthorizationResponse {
        let input = DeleteAppAuthorizationRequest(
            appAuthorizationIdentifier: appAuthorizationIdentifier, 
            appBundleIdentifier: appBundleIdentifier
        )
        return try await self.deleteAppAuthorization(input, logger: logger)
    }

    /// Deletes an app bundle. You must delete all associated app authorizations before you can delete an app bundle.
    @Sendable
    @inlinable
    public func deleteAppBundle(_ input: DeleteAppBundleRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteAppBundleResponse {
        try await self.client.execute(
            operation: "DeleteAppBundle", 
            path: "/appbundles/{appBundleIdentifier}", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes an app bundle. You must delete all associated app authorizations before you can delete an app bundle.
    ///
    /// Parameters:
    ///   - appBundleIdentifier: The ID or Amazon Resource Name (ARN) of the app bundle that needs to be deleted.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteAppBundle(
        appBundleIdentifier: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteAppBundleResponse {
        let input = DeleteAppBundleRequest(
            appBundleIdentifier: appBundleIdentifier
        )
        return try await self.deleteAppBundle(input, logger: logger)
    }

    /// Deletes an ingestion. You must stop (disable) the ingestion and you must delete all associated ingestion destinations before you can delete an app ingestion.
    @Sendable
    @inlinable
    public func deleteIngestion(_ input: DeleteIngestionRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteIngestionResponse {
        try await self.client.execute(
            operation: "DeleteIngestion", 
            path: "/appbundles/{appBundleIdentifier}/ingestions/{ingestionIdentifier}", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes an ingestion. You must stop (disable) the ingestion and you must delete all associated ingestion destinations before you can delete an app ingestion.
    ///
    /// Parameters:
    ///   - appBundleIdentifier: The Amazon Resource Name (ARN) or Universal Unique Identifier (UUID) of the app bundle to use for the request.
    ///   - ingestionIdentifier: The Amazon Resource Name (ARN) or Universal Unique Identifier (UUID) of the ingestion to use for the request.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteIngestion(
        appBundleIdentifier: String,
        ingestionIdentifier: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteIngestionResponse {
        let input = DeleteIngestionRequest(
            appBundleIdentifier: appBundleIdentifier, 
            ingestionIdentifier: ingestionIdentifier
        )
        return try await self.deleteIngestion(input, logger: logger)
    }

    /// Deletes an ingestion destination. This deletes the association between an ingestion and it's destination. It doesn't delete previously ingested data or the storage destination, such as the Amazon S3 bucket where the data is delivered. If the ingestion destination is deleted while the associated ingestion is enabled, the ingestion will fail and is eventually disabled.
    @Sendable
    @inlinable
    public func deleteIngestionDestination(_ input: DeleteIngestionDestinationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteIngestionDestinationResponse {
        try await self.client.execute(
            operation: "DeleteIngestionDestination", 
            path: "/appbundles/{appBundleIdentifier}/ingestions/{ingestionIdentifier}/ingestiondestinations/{ingestionDestinationIdentifier}", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes an ingestion destination. This deletes the association between an ingestion and it's destination. It doesn't delete previously ingested data or the storage destination, such as the Amazon S3 bucket where the data is delivered. If the ingestion destination is deleted while the associated ingestion is enabled, the ingestion will fail and is eventually disabled.
    ///
    /// Parameters:
    ///   - appBundleIdentifier: The Amazon Resource Name (ARN) or Universal Unique Identifier (UUID) of the app bundle to use for the request.
    ///   - ingestionDestinationIdentifier: The Amazon Resource Name (ARN) or Universal Unique Identifier (UUID) of the ingestion destination to use for the request.
    ///   - ingestionIdentifier: The Amazon Resource Name (ARN) or Universal Unique Identifier (UUID) of the ingestion to use for the request.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteIngestionDestination(
        appBundleIdentifier: String,
        ingestionDestinationIdentifier: String,
        ingestionIdentifier: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteIngestionDestinationResponse {
        let input = DeleteIngestionDestinationRequest(
            appBundleIdentifier: appBundleIdentifier, 
            ingestionDestinationIdentifier: ingestionDestinationIdentifier, 
            ingestionIdentifier: ingestionIdentifier
        )
        return try await self.deleteIngestionDestination(input, logger: logger)
    }

    /// Returns information about an app authorization.
    @Sendable
    @inlinable
    public func getAppAuthorization(_ input: GetAppAuthorizationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetAppAuthorizationResponse {
        try await self.client.execute(
            operation: "GetAppAuthorization", 
            path: "/appbundles/{appBundleIdentifier}/appauthorizations/{appAuthorizationIdentifier}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns information about an app authorization.
    ///
    /// Parameters:
    ///   - appAuthorizationIdentifier: The Amazon Resource Name (ARN) or Universal Unique Identifier (UUID) of the app authorization to use for the request.
    ///   - appBundleIdentifier: The Amazon Resource Name (ARN) or Universal Unique Identifier (UUID) of the app bundle to use for the request.
    ///   - logger: Logger use during operation
    @inlinable
    public func getAppAuthorization(
        appAuthorizationIdentifier: String,
        appBundleIdentifier: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetAppAuthorizationResponse {
        let input = GetAppAuthorizationRequest(
            appAuthorizationIdentifier: appAuthorizationIdentifier, 
            appBundleIdentifier: appBundleIdentifier
        )
        return try await self.getAppAuthorization(input, logger: logger)
    }

    /// Returns information about an app bundle.
    @Sendable
    @inlinable
    public func getAppBundle(_ input: GetAppBundleRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetAppBundleResponse {
        try await self.client.execute(
            operation: "GetAppBundle", 
            path: "/appbundles/{appBundleIdentifier}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns information about an app bundle.
    ///
    /// Parameters:
    ///   - appBundleIdentifier: The Amazon Resource Name (ARN) or Universal Unique Identifier (UUID) of the app bundle to use for the request.
    ///   - logger: Logger use during operation
    @inlinable
    public func getAppBundle(
        appBundleIdentifier: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetAppBundleResponse {
        let input = GetAppBundleRequest(
            appBundleIdentifier: appBundleIdentifier
        )
        return try await self.getAppBundle(input, logger: logger)
    }

    /// Returns information about an ingestion.
    @Sendable
    @inlinable
    public func getIngestion(_ input: GetIngestionRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetIngestionResponse {
        try await self.client.execute(
            operation: "GetIngestion", 
            path: "/appbundles/{appBundleIdentifier}/ingestions/{ingestionIdentifier}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns information about an ingestion.
    ///
    /// Parameters:
    ///   - appBundleIdentifier: The Amazon Resource Name (ARN) or Universal Unique Identifier (UUID) of the app bundle to use for the request.
    ///   - ingestionIdentifier: The Amazon Resource Name (ARN) or Universal Unique Identifier (UUID) of the ingestion to use for the request.
    ///   - logger: Logger use during operation
    @inlinable
    public func getIngestion(
        appBundleIdentifier: String,
        ingestionIdentifier: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetIngestionResponse {
        let input = GetIngestionRequest(
            appBundleIdentifier: appBundleIdentifier, 
            ingestionIdentifier: ingestionIdentifier
        )
        return try await self.getIngestion(input, logger: logger)
    }

    /// Returns information about an ingestion destination.
    @Sendable
    @inlinable
    public func getIngestionDestination(_ input: GetIngestionDestinationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetIngestionDestinationResponse {
        try await self.client.execute(
            operation: "GetIngestionDestination", 
            path: "/appbundles/{appBundleIdentifier}/ingestions/{ingestionIdentifier}/ingestiondestinations/{ingestionDestinationIdentifier}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns information about an ingestion destination.
    ///
    /// Parameters:
    ///   - appBundleIdentifier: The Amazon Resource Name (ARN) or Universal Unique Identifier (UUID) of the app bundle to use for the request.
    ///   - ingestionDestinationIdentifier: The Amazon Resource Name (ARN) or Universal Unique Identifier (UUID) of the ingestion destination to use for the request.
    ///   - ingestionIdentifier: The Amazon Resource Name (ARN) or Universal Unique Identifier (UUID) of the ingestion to use for the request.
    ///   - logger: Logger use during operation
    @inlinable
    public func getIngestionDestination(
        appBundleIdentifier: String,
        ingestionDestinationIdentifier: String,
        ingestionIdentifier: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetIngestionDestinationResponse {
        let input = GetIngestionDestinationRequest(
            appBundleIdentifier: appBundleIdentifier, 
            ingestionDestinationIdentifier: ingestionDestinationIdentifier, 
            ingestionIdentifier: ingestionIdentifier
        )
        return try await self.getIngestionDestination(input, logger: logger)
    }

    /// Returns a list of all app authorizations configured for an app bundle.
    @Sendable
    @inlinable
    public func listAppAuthorizations(_ input: ListAppAuthorizationsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListAppAuthorizationsResponse {
        try await self.client.execute(
            operation: "ListAppAuthorizations", 
            path: "/appbundles/{appBundleIdentifier}/appauthorizations", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns a list of all app authorizations configured for an app bundle.
    ///
    /// Parameters:
    ///   - appBundleIdentifier: The Amazon Resource Name (ARN) or Universal Unique Identifier (UUID) of the app bundle to use for the request.
    ///   - maxResults: The maximum number of results that are returned per call. You can use nextToken to obtain further pages of results. This is only an upper limit. The actual number of results returned per call might be fewer than the specified maximum.
    ///   - nextToken: If nextToken is returned, there are more results available. The value of nextToken is a unique pagination token for each page. Make the call again using the returned token to retrieve the next page. Keep all other arguments unchanged. Each pagination token expires after 24 hours. Using an expired pagination token will return an HTTP 400 InvalidToken error.
    ///   - logger: Logger use during operation
    @inlinable
    public func listAppAuthorizations(
        appBundleIdentifier: String,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListAppAuthorizationsResponse {
        let input = ListAppAuthorizationsRequest(
            appBundleIdentifier: appBundleIdentifier, 
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listAppAuthorizations(input, logger: logger)
    }

    /// Returns a list of app bundles.
    @Sendable
    @inlinable
    public func listAppBundles(_ input: ListAppBundlesRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListAppBundlesResponse {
        try await self.client.execute(
            operation: "ListAppBundles", 
            path: "/appbundles", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns a list of app bundles.
    ///
    /// Parameters:
    ///   - maxResults: The maximum number of results that are returned per call. You can use nextToken to obtain further pages of results. This is only an upper limit. The actual number of results returned per call might be fewer than the specified maximum.
    ///   - nextToken: If nextToken is returned, there are more results available. The value of nextToken is a unique pagination token for each page. Make the call again using the returned token to retrieve the next page. Keep all other arguments unchanged. Each pagination token expires after 24 hours. Using an expired pagination token will return an HTTP 400 InvalidToken error.
    ///   - logger: Logger use during operation
    @inlinable
    public func listAppBundles(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListAppBundlesResponse {
        let input = ListAppBundlesRequest(
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listAppBundles(input, logger: logger)
    }

    /// Returns a list of all ingestion destinations configured for an ingestion.
    @Sendable
    @inlinable
    public func listIngestionDestinations(_ input: ListIngestionDestinationsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListIngestionDestinationsResponse {
        try await self.client.execute(
            operation: "ListIngestionDestinations", 
            path: "/appbundles/{appBundleIdentifier}/ingestions/{ingestionIdentifier}/ingestiondestinations", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns a list of all ingestion destinations configured for an ingestion.
    ///
    /// Parameters:
    ///   - appBundleIdentifier: The Amazon Resource Name (ARN) or Universal Unique Identifier (UUID) of the app bundle to use for the request.
    ///   - ingestionIdentifier: The Amazon Resource Name (ARN) or Universal Unique Identifier (UUID) of the ingestion to use for the request.
    ///   - maxResults: The maximum number of results that are returned per call. You can use nextToken to obtain further pages of results. This is only an upper limit. The actual number of results returned per call might be fewer than the specified maximum.
    ///   - nextToken: If nextToken is returned, there are more results available. The value of nextToken is a unique pagination token for each page. Make the call again using the returned token to retrieve the next page. Keep all other arguments unchanged. Each pagination token expires after 24 hours. Using an expired pagination token will return an HTTP 400 InvalidToken error.
    ///   - logger: Logger use during operation
    @inlinable
    public func listIngestionDestinations(
        appBundleIdentifier: String,
        ingestionIdentifier: String,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListIngestionDestinationsResponse {
        let input = ListIngestionDestinationsRequest(
            appBundleIdentifier: appBundleIdentifier, 
            ingestionIdentifier: ingestionIdentifier, 
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listIngestionDestinations(input, logger: logger)
    }

    /// Returns a list of all ingestions configured for an app bundle.
    @Sendable
    @inlinable
    public func listIngestions(_ input: ListIngestionsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListIngestionsResponse {
        try await self.client.execute(
            operation: "ListIngestions", 
            path: "/appbundles/{appBundleIdentifier}/ingestions", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns a list of all ingestions configured for an app bundle.
    ///
    /// Parameters:
    ///   - appBundleIdentifier: The Amazon Resource Name (ARN) or Universal Unique Identifier (UUID) of the app bundle to use for the request.
    ///   - maxResults: The maximum number of results that are returned per call. You can use nextToken to obtain further pages of results. This is only an upper limit. The actual number of results returned per call might be fewer than the specified maximum.
    ///   - nextToken: If nextToken is returned, there are more results available. The value of nextToken is a unique pagination token for each page. Make the call again using the returned token to retrieve the next page. Keep all other arguments unchanged. Each pagination token expires after 24 hours. Using an expired pagination token will return an HTTP 400 InvalidToken error.
    ///   - logger: Logger use during operation
    @inlinable
    public func listIngestions(
        appBundleIdentifier: String,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListIngestionsResponse {
        let input = ListIngestionsRequest(
            appBundleIdentifier: appBundleIdentifier, 
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listIngestions(input, logger: logger)
    }

    /// Returns a list of tags for a resource.
    @Sendable
    @inlinable
    public func listTagsForResource(_ input: ListTagsForResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListTagsForResourceResponse {
        try await self.client.execute(
            operation: "ListTagsForResource", 
            path: "/tags/{resourceArn}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns a list of tags for a resource.
    ///
    /// Parameters:
    ///   - resourceArn: The Amazon Resource Name (ARN) of the resource for which you want to retrieve tags.
    ///   - logger: Logger use during operation
    @inlinable
    public func listTagsForResource(
        resourceArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListTagsForResourceResponse {
        let input = ListTagsForResourceRequest(
            resourceArn: resourceArn
        )
        return try await self.listTagsForResource(input, logger: logger)
    }

    /// Starts (enables) an ingestion, which collects data from an application.
    @Sendable
    @inlinable
    public func startIngestion(_ input: StartIngestionRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> StartIngestionResponse {
        try await self.client.execute(
            operation: "StartIngestion", 
            path: "/appbundles/{appBundleIdentifier}/ingestions/{ingestionIdentifier}/start", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Starts (enables) an ingestion, which collects data from an application.
    ///
    /// Parameters:
    ///   - appBundleIdentifier: The Amazon Resource Name (ARN) or Universal Unique Identifier (UUID) of the app bundle to use for the request.
    ///   - ingestionIdentifier: The Amazon Resource Name (ARN) or Universal Unique Identifier (UUID) of the ingestion to use for the request.
    ///   - logger: Logger use during operation
    @inlinable
    public func startIngestion(
        appBundleIdentifier: String,
        ingestionIdentifier: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> StartIngestionResponse {
        let input = StartIngestionRequest(
            appBundleIdentifier: appBundleIdentifier, 
            ingestionIdentifier: ingestionIdentifier
        )
        return try await self.startIngestion(input, logger: logger)
    }

    /// Starts the tasks to search user access status for a specific email address. The tasks are stopped when the user access status data is found. The tasks are terminated when the API calls to the application time out.
    @Sendable
    @inlinable
    public func startUserAccessTasks(_ input: StartUserAccessTasksRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> StartUserAccessTasksResponse {
        try await self.client.execute(
            operation: "StartUserAccessTasks", 
            path: "/useraccess/start", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Starts the tasks to search user access status for a specific email address. The tasks are stopped when the user access status data is found. The tasks are terminated when the API calls to the application time out.
    ///
    /// Parameters:
    ///   - appBundleIdentifier: The Amazon Resource Name (ARN) or Universal Unique Identifier (UUID) of the app bundle to use for the request.
    ///   - email: The email address of the target user.
    ///   - logger: Logger use during operation
    @inlinable
    public func startUserAccessTasks(
        appBundleIdentifier: String,
        email: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> StartUserAccessTasksResponse {
        let input = StartUserAccessTasksRequest(
            appBundleIdentifier: appBundleIdentifier, 
            email: email
        )
        return try await self.startUserAccessTasks(input, logger: logger)
    }

    /// Stops (disables) an ingestion.
    @Sendable
    @inlinable
    public func stopIngestion(_ input: StopIngestionRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> StopIngestionResponse {
        try await self.client.execute(
            operation: "StopIngestion", 
            path: "/appbundles/{appBundleIdentifier}/ingestions/{ingestionIdentifier}/stop", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Stops (disables) an ingestion.
    ///
    /// Parameters:
    ///   - appBundleIdentifier: The Amazon Resource Name (ARN) or Universal Unique Identifier (UUID) of the app bundle to use for the request.
    ///   - ingestionIdentifier: The Amazon Resource Name (ARN) or Universal Unique Identifier (UUID) of the ingestion to use for the request.
    ///   - logger: Logger use during operation
    @inlinable
    public func stopIngestion(
        appBundleIdentifier: String,
        ingestionIdentifier: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> StopIngestionResponse {
        let input = StopIngestionRequest(
            appBundleIdentifier: appBundleIdentifier, 
            ingestionIdentifier: ingestionIdentifier
        )
        return try await self.stopIngestion(input, logger: logger)
    }

    /// Assigns one or more tags (key-value pairs) to the specified resource.
    @Sendable
    @inlinable
    public func tagResource(_ input: TagResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> TagResourceResponse {
        try await self.client.execute(
            operation: "TagResource", 
            path: "/tags/{resourceArn}", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Assigns one or more tags (key-value pairs) to the specified resource.
    ///
    /// Parameters:
    ///   - resourceArn: The Amazon Resource Name (ARN) of the resource that you want to tag.
    ///   - tags: A map of the key-value pairs of the tag or tags to assign to the resource.
    ///   - logger: Logger use during operation
    @inlinable
    public func tagResource(
        resourceArn: String,
        tags: [Tag],
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> TagResourceResponse {
        let input = TagResourceRequest(
            resourceArn: resourceArn, 
            tags: tags
        )
        return try await self.tagResource(input, logger: logger)
    }

    /// Removes a tag or tags from a resource.
    @Sendable
    @inlinable
    public func untagResource(_ input: UntagResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UntagResourceResponse {
        try await self.client.execute(
            operation: "UntagResource", 
            path: "/tags/{resourceArn}", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Removes a tag or tags from a resource.
    ///
    /// Parameters:
    ///   - resourceArn: The Amazon Resource Name (ARN) of the resource that you want to untag.
    ///   - tagKeys: The keys of the key-value pairs for the tag or tags you want to remove from the specified resource.
    ///   - logger: Logger use during operation
    @inlinable
    public func untagResource(
        resourceArn: String,
        tagKeys: [String],
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UntagResourceResponse {
        let input = UntagResourceRequest(
            resourceArn: resourceArn, 
            tagKeys: tagKeys
        )
        return try await self.untagResource(input, logger: logger)
    }

    /// Updates an app authorization within an app bundle, which allows AppFabric to connect to an application. If the app authorization was in a connected state, updating the app authorization will set it back to a PendingConnect state.
    @Sendable
    @inlinable
    public func updateAppAuthorization(_ input: UpdateAppAuthorizationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateAppAuthorizationResponse {
        try await self.client.execute(
            operation: "UpdateAppAuthorization", 
            path: "/appbundles/{appBundleIdentifier}/appauthorizations/{appAuthorizationIdentifier}", 
            httpMethod: .PATCH, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates an app authorization within an app bundle, which allows AppFabric to connect to an application. If the app authorization was in a connected state, updating the app authorization will set it back to a PendingConnect state.
    ///
    /// Parameters:
    ///   - appAuthorizationIdentifier: The Amazon Resource Name (ARN) or Universal Unique Identifier (UUID) of the app authorization to use for the request.
    ///   - appBundleIdentifier: The Amazon Resource Name (ARN) or Universal Unique Identifier (UUID) of the app bundle to use for the request.
    ///   - credential: Contains credentials for the application, such as an API key or OAuth2 client ID and secret. Specify credentials that match the authorization type of the app authorization to update. For example, if the authorization type of the app authorization is OAuth2 (oauth2), then you should provide only the OAuth2 credentials.
    ///   - tenant: Contains information about an application tenant, such as the application display name and identifier.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateAppAuthorization(
        appAuthorizationIdentifier: String,
        appBundleIdentifier: String,
        credential: Credential? = nil,
        tenant: Tenant? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateAppAuthorizationResponse {
        let input = UpdateAppAuthorizationRequest(
            appAuthorizationIdentifier: appAuthorizationIdentifier, 
            appBundleIdentifier: appBundleIdentifier, 
            credential: credential, 
            tenant: tenant
        )
        return try await self.updateAppAuthorization(input, logger: logger)
    }

    /// Updates an ingestion destination, which specifies how an application's ingested data is processed by Amazon Web Services AppFabric and where it's delivered.
    @Sendable
    @inlinable
    public func updateIngestionDestination(_ input: UpdateIngestionDestinationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateIngestionDestinationResponse {
        try await self.client.execute(
            operation: "UpdateIngestionDestination", 
            path: "/appbundles/{appBundleIdentifier}/ingestions/{ingestionIdentifier}/ingestiondestinations/{ingestionDestinationIdentifier}", 
            httpMethod: .PATCH, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates an ingestion destination, which specifies how an application's ingested data is processed by Amazon Web Services AppFabric and where it's delivered.
    ///
    /// Parameters:
    ///   - appBundleIdentifier: The Amazon Resource Name (ARN) or Universal Unique Identifier (UUID) of the app bundle to use for the request.
    ///   - destinationConfiguration: Contains information about the destination of ingested data.
    ///   - ingestionDestinationIdentifier: The Amazon Resource Name (ARN) or Universal Unique Identifier (UUID) of the ingestion destination to use for the request.
    ///   - ingestionIdentifier: The Amazon Resource Name (ARN) or Universal Unique Identifier (UUID) of the ingestion to use for the request.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateIngestionDestination(
        appBundleIdentifier: String,
        destinationConfiguration: DestinationConfiguration,
        ingestionDestinationIdentifier: String,
        ingestionIdentifier: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateIngestionDestinationResponse {
        let input = UpdateIngestionDestinationRequest(
            appBundleIdentifier: appBundleIdentifier, 
            destinationConfiguration: destinationConfiguration, 
            ingestionDestinationIdentifier: ingestionDestinationIdentifier, 
            ingestionIdentifier: ingestionIdentifier
        )
        return try await self.updateIngestionDestination(input, logger: logger)
    }
}

extension AppFabric {
    /// Initializer required by `AWSService.with(middlewares:timeout:byteBufferAllocator:options)`. You are not able to use this initializer directly as there are not public
    /// initializers for `AWSServiceConfig.Patch`. Please use `AWSService.with(middlewares:timeout:byteBufferAllocator:options)` instead.
    public init(from: AppFabric, patch: AWSServiceConfig.Patch) {
        self.client = from.client
        self.config = from.config.with(patch: patch)
    }
}

// MARK: Paginators

@available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *)
extension AppFabric {
    /// Return PaginatorSequence for operation ``listAppAuthorizations(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listAppAuthorizationsPaginator(
        _ input: ListAppAuthorizationsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListAppAuthorizationsRequest, ListAppAuthorizationsResponse> {
        return .init(
            input: input,
            command: self.listAppAuthorizations,
            inputKey: \ListAppAuthorizationsRequest.nextToken,
            outputKey: \ListAppAuthorizationsResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listAppAuthorizations(_:logger:)``.
    ///
    /// - Parameters:
    ///   - appBundleIdentifier: The Amazon Resource Name (ARN) or Universal Unique Identifier (UUID) of the app bundle to use for the request.
    ///   - maxResults: The maximum number of results that are returned per call. You can use nextToken to obtain further pages of results. This is only an upper limit. The actual number of results returned per call might be fewer than the specified maximum.
    ///   - logger: Logger used for logging
    @inlinable
    public func listAppAuthorizationsPaginator(
        appBundleIdentifier: String,
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListAppAuthorizationsRequest, ListAppAuthorizationsResponse> {
        let input = ListAppAuthorizationsRequest(
            appBundleIdentifier: appBundleIdentifier, 
            maxResults: maxResults
        )
        return self.listAppAuthorizationsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listAppBundles(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listAppBundlesPaginator(
        _ input: ListAppBundlesRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListAppBundlesRequest, ListAppBundlesResponse> {
        return .init(
            input: input,
            command: self.listAppBundles,
            inputKey: \ListAppBundlesRequest.nextToken,
            outputKey: \ListAppBundlesResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listAppBundles(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: The maximum number of results that are returned per call. You can use nextToken to obtain further pages of results. This is only an upper limit. The actual number of results returned per call might be fewer than the specified maximum.
    ///   - logger: Logger used for logging
    @inlinable
    public func listAppBundlesPaginator(
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListAppBundlesRequest, ListAppBundlesResponse> {
        let input = ListAppBundlesRequest(
            maxResults: maxResults
        )
        return self.listAppBundlesPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listIngestionDestinations(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listIngestionDestinationsPaginator(
        _ input: ListIngestionDestinationsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListIngestionDestinationsRequest, ListIngestionDestinationsResponse> {
        return .init(
            input: input,
            command: self.listIngestionDestinations,
            inputKey: \ListIngestionDestinationsRequest.nextToken,
            outputKey: \ListIngestionDestinationsResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listIngestionDestinations(_:logger:)``.
    ///
    /// - Parameters:
    ///   - appBundleIdentifier: The Amazon Resource Name (ARN) or Universal Unique Identifier (UUID) of the app bundle to use for the request.
    ///   - ingestionIdentifier: The Amazon Resource Name (ARN) or Universal Unique Identifier (UUID) of the ingestion to use for the request.
    ///   - maxResults: The maximum number of results that are returned per call. You can use nextToken to obtain further pages of results. This is only an upper limit. The actual number of results returned per call might be fewer than the specified maximum.
    ///   - logger: Logger used for logging
    @inlinable
    public func listIngestionDestinationsPaginator(
        appBundleIdentifier: String,
        ingestionIdentifier: String,
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListIngestionDestinationsRequest, ListIngestionDestinationsResponse> {
        let input = ListIngestionDestinationsRequest(
            appBundleIdentifier: appBundleIdentifier, 
            ingestionIdentifier: ingestionIdentifier, 
            maxResults: maxResults
        )
        return self.listIngestionDestinationsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listIngestions(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listIngestionsPaginator(
        _ input: ListIngestionsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListIngestionsRequest, ListIngestionsResponse> {
        return .init(
            input: input,
            command: self.listIngestions,
            inputKey: \ListIngestionsRequest.nextToken,
            outputKey: \ListIngestionsResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listIngestions(_:logger:)``.
    ///
    /// - Parameters:
    ///   - appBundleIdentifier: The Amazon Resource Name (ARN) or Universal Unique Identifier (UUID) of the app bundle to use for the request.
    ///   - maxResults: The maximum number of results that are returned per call. You can use nextToken to obtain further pages of results. This is only an upper limit. The actual number of results returned per call might be fewer than the specified maximum.
    ///   - logger: Logger used for logging
    @inlinable
    public func listIngestionsPaginator(
        appBundleIdentifier: String,
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListIngestionsRequest, ListIngestionsResponse> {
        let input = ListIngestionsRequest(
            appBundleIdentifier: appBundleIdentifier, 
            maxResults: maxResults
        )
        return self.listIngestionsPaginator(input, logger: logger)
    }
}

extension AppFabric.ListAppAuthorizationsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> AppFabric.ListAppAuthorizationsRequest {
        return .init(
            appBundleIdentifier: self.appBundleIdentifier,
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}

extension AppFabric.ListAppBundlesRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> AppFabric.ListAppBundlesRequest {
        return .init(
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}

extension AppFabric.ListIngestionDestinationsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> AppFabric.ListIngestionDestinationsRequest {
        return .init(
            appBundleIdentifier: self.appBundleIdentifier,
            ingestionIdentifier: self.ingestionIdentifier,
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}

extension AppFabric.ListIngestionsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> AppFabric.ListIngestionsRequest {
        return .init(
            appBundleIdentifier: self.appBundleIdentifier,
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}
